Los elementos de programación FORTRAN y en general de cualquier otro lenguaje son:
|Enteras |Numéricas | |Sin exponente Constantes | |Reales | |Alfanuméricas |Con exponenteLas constantes enteras son cantidades numéricas sin punto decimal. El número máximo para una constante entera varía de computadora a computadora (-32768, 32767 por ejemplo). En este tipo de constantes es válido omitir el signo +.
Las constantes reales sin exponente son cantidades con punto decimal.
Las constantes reales con exponente tienen el significado de números multiplicados por una potencia de 10. La forma general de estas últimas es aEx. Donde a es una constante real sin exponente y x es una constante entera (con o sin signo).
En este tipo de constantes no son válidas letras, comas o dobles signos a excepción de un punto decimal y de la letra E (notación exponencial). El mayor valor depende también de la computadora que se maneje.
Las constantes de tipo alfanumérico son aquellas cadenas de combinaciones de números, letras y caracteres especiales encerrados entre comillas.
La longitud de una variable (su tamaño máximo en caracteres), varía de computadora a computadora, por lo que se recomienda limitarla a 5 caracteres.
|Simples |Doble precisión |Enteras |Complejas Variables | |Alfanuméricas | | |Simples |Reales |Doble precisión |Complejas |Alfanuméricas
En las variables no es válido incluir caracteres especiales como /, +, %, etc.
** Exponenciación * Multiplicación / División + Suma - RestaLa jerarquía de las operaciones es, primero la exponenciación, luego multiplicaciones y/o divisiones y finalmente sumas y restas. En caso de existir en una expresión varias operaciones de igual jerarquía, se ejecutarán en el orden en el que aparecen en la expresión, de izquierda a derecha; excepto en el caso de varias exponenciaciones que son ejecutadas de derecha a izquierda.
Es posible modificar dicha jerarquía con el uso de paréntesis, primero se realizan las operaciones dentro del paréntesis más interno y así sucesivamente y siempre de izquierda a derecha.
Estos símbolos nos permiten operar tanto con constantes como con variables. 3/5 e I/K producen resultados enteros. 3.0/5.0 y A/B producen resultados reales.
El uso de paréntesis cambia notablemente el significado de las expresiones en caso de que no sea empleado correctamente. En la escritura de expresiones en FORTRAN no es válido emplear dos operadores juntos: A**(-2) es la forma correcta.
En el caso de exponentes se recomienda que éstos sean enteros ya que una expresión como X**2.0 se evalúa por series, mientras que X**2 se calcula como el producto X*X.
La parte que se encuentra encerrada dentro del paréntesis recibe el nombre de argumento, el cual puede ser una constante o variable numérica, o bien una expresión matemática.
El valor del argumento para las funciones trigonométricas tales como seno, coseno, etc. se debe proporcionar en radianes.
Función Descripción SIN(X) Seno trigonométrico de X COS(X) Coseno trigonométrico de X ATAN(X) Ángulo cuya tangente es X ABS(X) Valor absoluto de X EXP(X) Exponencial de X ALOG(X) Logaritmo natural de X SQRT(X) Raíz cuadrada de X TAN(X) Tangente de X COT(X) Cotangente de X ALOG10(X) Logaritmo en base 10 de X TANGH(X) Tangente hiperbólico de X IMIX(X) Conversión de tipo real a entero FLOAT(I) Conversión de tipo entero a real RANDOM(X) Generador de números pseudo aleatoriosEn todos los casos X es una variable real o una constante real o una expresión aritmética real e I es una variable entera o una expresión entera.
Una vez codificado en algún lenguaje, por ejemplo en FORTRAN, es necesario administrárselo a la máquina por alguna unidad de entrada.
Explicaremos la codificación en tarjetas.
Descripción de una tarjeta:
80 columnas ------------------------------ / 12 | | | 11 | | Zonas superiores | 0 | | | 1 | | 2 | | . | Zonas inferiores | . | | 9 | -------------------------------Las instrucciones se perforan en dichas tarjetas de acuerdo a un código (código Hollerith), los números se representan mediante una sola perforación:
0 Se tiene una perforación en zona 0 1 Se tiene una perforación en zona 1 2 Se tiene una perforación en zona 2 ... 9 Se tiene una perforación en zona 9Las letras son las que representan dos perforaciones en la misma columna (uno en zona superior y otro en zona inferior):
A perforaciones en 12 y 1 B perforaciones en 12 y 2 C perforaciones en 12 y 3 ... Z perforaciones en 0 y 9Existen además 10 caracteres especiales como +, -, *, (, ), -, etc., para éstos el código marca una o dos o tres perforaciones por columna.
- perforación en zona 11 / perforación en 0 y 1 * perforación en 11, 4 y 8En una tarjeta de un programa fuente se emplean las columnas como sigue:
Columna 1 Cuando se perfora una letra C, indica que esta tarjeta contiene un comentario Columnas 1 a 5 Para perforar números de proposiciones o de formatos Columna 6 Cuando la proposición o instrucción no se alcanzó a perforar en una tarjeta, entonces se usa una tarjeta adicional en la cual se perfora un carácter distinto de cero, con lo que se indica que es continuación de la instrucción anterior Columnas 7 a 72 Para perforar la instrucción o proposición en FORTRANLas columnas 73 a 80 no son procesadas, por lo que su uso depende del programador (seriar tarjetas, poner ciertos caracteres para visualizar instrucciones, etc.).
Las tarjetas que corresponden a la parte de datos de un programa emplean las 80 columnas.
Generalmente todas las tarjetas son perforadas tomando las instrucciones señaladas en una hoja de codificación. Una hoja de codificación reúne, por lo general, un total de 25 tarjetas.
Forma general de una lectura 7 READ(N,M) lista <----Conjunto de variables | | separadas por comas | | | ---------Número del formato con el que va a | leer las variables de la lista | -----------Número de la unidad de lectura, es una constante entera que varía de computadora a computadora Forma general de una salida por impresora 7 WRITE(N,M) lista <----variables separadas por comas | | | | | ---------Número de formato | | -----------Número asignado a la unidad de impresión
Al estar siempre en relación con el uso de teletipos, las instrucciones INPUT y PRINT no necesitan una lista de control como en el caso de READ y WRITE. Asimismo, el formato puede ser el predeterminado por el compilador FORTRAN.
10 INPUT A,B 80 PRINT A,B o 10 INPUT X 20 PRINT,'EL VALOR DE X ES',X
READ(2,10)I,J,K 10 FORMAT(I2,I3,I1)Indica que el valor de la variable I se encuentra en las primeras dos columnas de la tarjeta, el valor de J en las columnas tres, cuatro y cinco, y el valor K en la columna seis; nótese que la variable I no tiene relación en su nombre, con la definición de la especificación "In".
Los valores enteros siempre deben indicarse hasta la extrema derecha del campo.
READ(2,20)A 20 FORMAT(F4.2)Indica que el valor de A se encuentra en las primeras cuatro columnas de la tarjeta y que es posible que tenga dos decimales.
Cuando se trata de escribir resultados, es conveniente separarlos entre sí; esto se logra empleando la especificación nX, en la que n es un número entero que indica el total de columnas de separación.
Para imprimir letreros es necesario indicarlos entre apóstrofes o mediante especificaciones de campo Hollerith.
WRITE (6,100) Z 100 FORMAT(10X, 'EL VALOR DE Z ES', *2X,F10.4) ó WRITE(6,200)Z 200 FORMAT(10X,16HEL VALOR DE Z ES, *2X,F10.4)Ambos formatos son equivalentes, el segundo de ellos incluye la especificación de Hollerith que indica el total de espacios que deben escribirse 16 H, estos espacios se cuentan inmediatamente después de la H.
Al imprimir resultados es necesario incluir el control de carro como primera instrucción de formato:
1H1 ó '1' Para ubicar el carro de impresión en la parte alta de la siguiente hoja. 1H0 ó '0' Salta una línea antes de escribir (espacio doble). 1H+ ó '+' Evita el salto a la siguiente línea (reimprime sobre la línea anterior). 1H ó '_' Para imprimir a renglón seguido.También es válido emplear nX al principio. Esto equivale a la última instrucción para el control de carro (n debe ser un entero positivo).
WRITE(6,200)A,B,Z 200 FORMAT(1H0,'A=',F10.4,2X, *'B=',F8.2,3X,F12.4)
READ(5,500)A,B,C,D,E 500 FORMAT(5A4) WRITE(6,800)A,B,C,D,E 800 FORMAT(1H0,5A4)Veamos como ejemplo, la lectura y escritura de la siguiente tarjeta:
1234567890123456789 /----------------------- |DATOS ALFANUMÉRICOS | READ (5,100)T1,T2,T3,T4,T5 100 FORMAT(4A4,A3) WRITE(6,200)T1,T2,T3,T4,T5 200 FORMAT(1H0,4A4,A3)El programa anterior para una computadora, emplea cuatro especificaciones alfanuméricas de cuatro columnas de ancho y una de tres columnas. El mismo programa para otra:
READ(5,100)T1,T2,T3,T4 100 FORMAT(3A6,A1) WRITE(6,200)T1,T2,T3,T4 200 FORMAT(1H0,3A6,A1)Por supuesto que este último, el propósito es minimizar el uso de memoria, ya que de antemano sabemos que el primer programa también funciona en otras computadoras con las respectivas tarjetas de control.
El resultado de la expresión generalmente se almacena en alguna variable para su uso posterior. La forma general de una instrucción de asignación es la siguiente V=E. V es cualquier variable (entera o real), que recibe el valor calculado en la expresión. = es la instrucción de sustitución o asignación. E es la expresión aritmética en FORTRAN.
Por lo tanto V=E en una proposición de asignación aritmética, es decir FORTRAN realiza primero la expresión a la derecha del signo igual y el valor obtenido lo asigna a la variable que está a la izquierda de dicho signo.
GO TO 98
GO TO(n1,n2,..,np),ILos números encerrados entre paréntesis y separados por comas, corresponden a números de instrucciones ejecutables a las que se transferirá el control dependiendo del valor de la variable I. Los números entre paréntesis no requieren ir en orden ascendente e inclusive se pueden repetir.
La variable que sigue a la coma siempre debe ser de modo entero y su valor transfiere el control a aquella instrucción que corresponda con la posición de los números entre paréntesis.
I=2 GO TO(15,12,13),IEn este caso transfiere el control a la instrucción número 12 ya que está indicada como segundo argumento del GO TO calculado.
Generalmente I puede tener cuando menos los valores de 1 a 10. Evidentemente no es válido darle valores mayores que el número de argumentos o valores negativos, cuando esto se hace, la computadora ejecuta la instrucción que sigue al GO TO calculado.
Cuando e es negativo se transfiere el control a n1. Cuando e es cero a n2 y cuando e es positivo a n3 Forma general: IF(e) n1,n2,n3 X=1.0 B=2.0 IF(X-B**2)3,2,5En este caso como 1-4=-3 el control se envía hacia la instrucción numérica 3.
IF (e1.operador relacional.e2)instrucción
e1 y e2 son las expresiones que se van a comparar. Los operadores relacionales son los siguientes:
.LT. Menor que (<) .LE. Menor o igual (<=) .EQ. Igual (=) .GE. Mayor o igual (>=) .GT. Mayor que (>)En las expresiones lógicas se utilizan, además de los operadores relacionales, los operadores lógicos:
.OR. o .AND. y .NOT. noEjemplos:
IF((A.EQ.B).AND.(B.EQ.C))WRITE(3,100) 100 FORMAT(2X,"A=B=C") B=2.*A otro: IF((A.EQ.B).OR.(A.EQ.D))C=A+B E=C+dEn el primer caso se deben cumplir las dos condiciones para que se ejecute el WRITE(3,100), en el caso contrario continúa a la siguiente instrucción ejecutable (B=2.*A).
En el segundo caso basta que se cumpla alguna de las dos condiciones.
DO n I=n1,n2,n3 Instrucciones n CONTINUEn es un número positivo que corresponde con la última instrucción ejecutable en el ámbito del DO. Instrucciones no ejecutables no son válidas como límite del rango de un DO (ejemplo: FORMAT, DIMENSION, Comentarios).
I es una variable de tipo entero que variará de su valor inicial n a su valor final n2, en incrementos de valor n3. Si el incremento es unitario se puede omitir n3.
n1, n2, n3 son variables o constantes de tipo entero, sin embargo, algunas computadoras permiten valores fraccionarios o variables reales.
El DO equivale en principio a los siguientes elementos:
una pregunta
una transferencia de control
El emplear varios ciclos iterativos en forma anidada (un DO dentro del ámbito de otro DO), nos permite programar en forma más fácil, por ejemplo el manejo de variables de 2 y 3 dimensiones, en lectura, etc.
Al utilizar ciclos anidados se deben observar las siguientes reglas:
2.- La última proposición en el ámbito de un DO no debe ser un GO TO, un IF, un RETURN, un STOP, un PAUSE, u otro DO.
3.- No es válido dentro del ámbito de un DO, utilizar proposiciones que alteren alguno de los parámetros de índice del DO (I, n1, n2, n3).
4.- No es válido realizar una transferencia de control al interior del ámbito de un DO; sin embargo, sí es válida una transferencia de control de un DO interior hacia el ámbito de un DO exterior.
DIMENSION A(10,10) READ(5,100)N,M DO 2 I=1,N DO 2 J=1,M READ(5,200) A(I,J) 2 WRITE(6,300) A(I,J) 100 FORMAT (2I2) 200 FORMAT (F8.2) 300 FORMAT (2X,F8.2) CALL EXIT ENDO también:
DIMENSION A(10,10) READ(5,100)N,M DO 2 I=1,N READ(5,200) (A(I,J),J=1,N) 2 WRITE(6,300) (A(I,J),J=1,M) 100 FORMAT (2I2) 200 FORMAT (10F8.0) 300 FORMAT (10(2X,F8.2)) CALL EXIT ENDEn este último caso los DO's internos se encuentran de manera implícita en las instrucciones READ y WRITE.
En los ciclos anidados, el ciclo más interno se repite por cada variación exterior.
I=1,4 J=1,7 K=1,2 L=1,5 M=1,10 N=1,2En este caso N tomará los valores de 1 y 2 un total de 2800 veces.
En la declaración DIMENSION, los índices de las variables, deberán ser constantes enteras, separadas por comas cuando haya más de una.
Para identificar algún elemento en especial se emplea la variable que define el arreglo, pero como índice siempre se utiliza una variable de modo entero.
DIMENSION A(7,7),Z(5,1,4),L(3,2) A(3,5)=2.0 Z(1,1,1)=-35.7 l(2,2)=84Esto es, podemos abarcar los valores de cada elemento del arreglo en el plano cartesiano o en el arreglo tridimensional.
DATA A,B,C,...,Z/Valores de cualquier tipo (separadas por comas)/La declaración DATA se indica al principio del programa (después de DIMENSION, COMMON, INTEGER), y es válida sólo al inicio de la ejecución. Por supuesto, las variables pueden cambiar sus valores con el proceso, pero no es válido tratar de ejecutar una segunda vez esta declaración.
DATA AB,C,D,I/'ALTA',-14.5,0.15E-12,7/ ó DIMENSION K(12) DATA K/12*2/En este último ejemplo se ha inicializado el vector K con sus 12 elementos por efecto del * y el valor entero que le precede.
DIMENSION N(8) DATA N/8*' '/En el que se han inicializado los elementos del vector N en el valor alfanumérico ' '.
DIMENSION Z(7),B(4),X(3) DATA X(3),Z(4),B(3),B(1)/3.5,4.2,0.0,-1.0/Nótese que la lista de variables se indica según se desee.
INTEGER A,B,C,X REAL I,J,K,LEstas declaraciones pueden usarse junto con DIMENSION.
DIMENSION K(10) INTEGER K equivale a: INTEGER K(10) Otro: DIMENSION T(7),Y(4),I(3),L(8),MAS(12) INTEGER T,Y,I REAL L,MAS equivale a: INTEGER Y(7),Y(4),I(3) REAL L(8),MAS(12)Se observa que las declaraciones REAL, INTEGER también tienen la función de reservar memoria para arreglos.
COMMON A,B,C,D(10) DATA D/10*10.0/ A=1.5 B=0.0 C=-3.5 CALL SUBA WRITE (6,300)A,B,C,(D(I),I=1,10) 300 FORMAT (13(1X,F6.2)) CALL EXIT ENDLa subrutina:
SUBROUTINE SUBA COMMON X,Y,Z,T(10) X=X+Y+Z Y=X-Y-Z ... DO 12 I=1,10 12 T(I)=X+Y RETURN ENDComo se observa, la subrutina SUBA necesitaría un total de 13 argumentos si no se usara COMMON. Las variables en COMMON ocupan la misma localización de almacenamiento, de ahí que se les pueda dar un nombre en el programa principal y otro en el subprograma. Esto es, la primera localidad de almacenamiento se llama A en el programa principal y X en el subprograma, la segunda B y Y, la tercera C y Z y de igual forma el vector D y T con una equivalencia elemento a elemento. Realmente lo necesario es respetar el modo (entero o real) de las variables y la posición de éstas.
COMPLEX lista de variablesLa lista de variables deberá ir separada por comas. La declaración COMPLEX puede tener, agregada a ella, la función de reserva de memoria:
COMPLEX A(20),T(5),>(5,5) COMPLEX H,WComo se observa en la primera declaración se tienen arreglos de una y dos dimensiones. En la segunda declaración, sólo variables sin índice (nótese que es posible omitir la segunda declaración incluyendo toda la lista en la primera declaración).
Ya en el proceso de nuestro programa, a fin de formar nuevos valores complejos, podemos emplear la función CMPLX.
COMPLEX T(2) A=3.5 B=1.0 T(1)=CMPLX(A,B) T(2)=CMPLX(A,-B) WRITE(6,100)T(1),T(2) 100 FORMAT(5X,2G15.7,5X,2G15.7)Evidentemente T(1) y T(2), están recibiendo valores complejos y por lo tanto requieren cada uno de ellos de dos especificaciones de campo para su escritura.
En FORTRAN se emplean funciones y subrutinas, el subprograma para definir una función se conoce como subprograma FUNCTION, el subprograma para definir una subrutina es el subprograma SUBROUTINE.
La llamada de un FUNCTION es igual a la llamada de funciones de biblioteca como es el caso de SIN(X), ABS(X), esto es, dado un valor al argumento, el subprograma FUNCTION nos calcula un valor que corresponde a la función en sí, asignando dicho valor al nombre propio de la función.
Función que evalúa un polinomio de segundo orden:
C PROGRAMA PRINCIPAL X=3.0 Y=F(X,A,B,C) C LA FUNCION ESTA DEFINIDA EN EL C SUBPROGRAMA. SU NOMBRE ES F C SUS ARGUMENTOS SON X,A,B,C ... END El subprograma FUNCTION: C FUNCTION F(X,A,B,C) F=A*X**2+B*X+C RETURN ENDUn subprograma FUNCTION puede manejar varios argumentos que deben corresponder en número y modo con los definidos en el programa que lo va a usar, (en este caso 4 argumentos reales); la característica distintiva es que el FUNCTION regresa sólo un valor como resultado y dicho valor se asocia con el nombre del FUNCTION mismo (en este caso F con lo que se sabe que es una función real).
El subprograma FUNCTION recibe los valores de los argumentos al mencionarse la función en el programa principal, inmediatamente evalúa el proceso indicado en el FUNCTION y regresa por efecto del RETURN a la instrucción misma que lo llamó para de ahí continuar con el programa.
CALL AREA(A,B,C)Los argumentos permiten enviar valores de variables a la subrutina y también recibir resultados de ella para cada variable enviada.
SUBROUTINE AREA(X,Y,Z) X=0.5*Y*Z RETURN ENDEvidentemente la variable X del subprograma corresponde con la variable A del programa que llama, Y con B y X con la variable C, en esto es definitivamente necesario respetar el modo de las variables; el nombre de éstas pueden cambiarse al gusto.
En este caso conviene mandarla a una memoria secundaria, como pueden ser discos o cintas, y de ahí recuperarla o grabarla, conservando en la memoria de alta velocidad sólo lo indispensable.
Veremos como ejemplo el manejo de archivos en una computadora IBM 1130.
Cada disco contiene 200 cilindros, cada cilindro está formateado por 2 pistas (una inferior y otra superior), cada pista se divide en 4 sectores; cada sector permite 320 palabras para almacenamiento de información.
El disco cuenta con 1600 sectores numerados del 0 al 1599 en la primera palabra de cada uno de ellos. Con esto se dispone de 512000 palabras de computadora. La información se almacena a partir del principio de cada sector ocupando siempre un número entero de palabras. El archivo está formado por un conjunto de registros. Un registro contiene toda la información relativa a un concepto (por ejemplo los registros de alumnos para préstamo de libros de una biblioteca).
Esto es, un registro puede ser; una tarjeta perforada, una línea impresa, etc.
Para la computadora es necesario indicar el tamaño del registro (en palabras de computadora). La computadora del ejemplo asigna el siguiente tamaño a las variables:
Enteras 1 palabra Reales 2 palabrasSi se emplea alguna instrucción para el compilador FORTRAN es posible asignar dos palabras a variables enteras y tres a variables reales.
El tamaño de cada registro es importante dado que:
Con el total de registros definiremos el tamaño de nuestro archivo
NOM arreglo de 7 elementos 14 palabras CARR arreglo de 6 elementos 12 palabras NOCTA arreglo de 2 elementos 4 palabras N variable entera (edad) 1 palabra DIMENSION NOM(7),CARR(6),NOCTA(2) C DECLARACION DEL ARCHIVO DEFINE FILE 1(1000,31,U,KRO) C LECTURA DE DATOS DE TARJETA NREG=0 1 READ(2,10,END=7)NOM,CARR,NOCTA,N NREG=NREG+1 C GRABADO A DISCO WRITE(1'NREG)(NOM(K),K=1,7),CARR,NOCTA,N GO TO 1 C RECUPERACIÓN DE DISCO E IMPRESION C DE REGISTROS EN PAPEL 7 DO 2 MREG=1,NREG READ(1'MREG)NOM,CARR,NOCTA,N 2 WRITE(3,11)NOM,(CARR(L),L=1,6)NOCTA,N WRITE(3,12) 10 FORMAT(I2,7A4,2X,6A4,6X,2A4,2X,I2) 11 FORMAT(5X,7A4,3X,6A4,4X,2A4,3X,I2) 12 FORMAT(//////,5X,77(1H$),///) *34X,15H FIN DE ARCHIVO,//) CALL EXIT ENDPara almacenar permanentemente en disco el archivo, deberemos indicar las siguientes tarjetas:
// JOB // FOR * SAVE * IOCS (DISK) } PROG. FUENTE // XEQ } DATOS // DUF * STORE WS UA EJEM 100Como observamos cada registro tiene un tamaño de 31 palabras, y por tanto 320/31=10 registros por sector con un total de 10 palabras no empleadas. A su vez esto implica que usaremos 1000/10=10 sectores.
El archivo está identificado por el número arbitrario 1 en la declaración de archivo DEFINE FILE; en ésta la U (3er. elemento), no nos interesa mas que indicarla y su significado es SIN FORMATO en disco.
El cuarto elemento es una variable entera arbitraria que lleva un control automático de registros.
Por último es importante notar que las lecturas y escrituras a disco, en la computadora que hemos tomado para el ejemplo, se caracterizan por indicar el número de identificación del archivo y el número del registro ligados por un apóstrofo, lo cual varía de computadora a computadora.